	package com.sisgesbyte.services.proyeccion;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;

import com.sisgesbyte.common.ConstModAdministracion;
import com.sisgesbyte.common.ConstProyeccion;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.proyeccion.ConsultaTotalProyeccionDao;
import com.sisgesbyte.dao.proyeccion.MantBandaProyeccionDao;
import com.sisgesbyte.dao.proyeccion.MantProyeccionPeriodoDao;
import com.sisgesbyte.dao.ventas.ConsultaVentasDao;
import com.sisgesbyte.data.entity.proyeccion.BandaProyeccionEntity;
import com.sisgesbyte.data.entity.proyeccion.ProyeccionPeriodoEntity;
import com.sisgesbyte.data.entity.ventas.VentaTotalEntity;
import com.sisgesbyte.data.entity.ventas.VentasPeriodoEntity;
import com.sisgesbyte.services.proyeccion.bean.AvancePeriodoBean;
import com.sisgesbyte.services.proyeccion.bean.AvanceProyectadoPeriodoResponse;
import com.sisgesbyte.services.proyeccion.bean.VentaTotalBean;
import com.sisgesbyte.services.proyeccion.bean.VentasPorPeriodoBean;

@Stateless
public class ProyeccionPeriodoServiceImpl implements ProyeccionPeriodoService {

	@EJB
	private MantProyeccionPeriodoDao mantProyeccionPeriodoDao;
	@EJB
	private MantBandaProyeccionDao bandaProyeccionDao;
	@EJB
	private ConsultaVentasDao consultaVentasDao;
	@EJB
	private ConsultaTotalProyeccionDao consultaTotalProyeccionDao;
	@Inject
	private Validaciones validaciones;
	
	
	@Override
	public AvanceProyectadoPeriodoResponse listaAvancePorPeriodo(String codTransaccion) {
		String mensajeTransaccionMetodo = "[listaAvancePorPeriodo idTx=" + codTransaccion + "] - ";
		AvanceProyectadoPeriodoResponse response = new AvanceProyectadoPeriodoResponse();
		
		try{
			 response.setIdTransaccion(codTransaccion);
			 List<ProyeccionPeriodoEntity> resDao = null;
			try{
				//1.- capturamos las proyecciones por periodo
				resDao = mantProyeccionPeriodoDao.listaProyeccionPorPeriodo(null);
			}catch(Exception e){
				System.out.println(mensajeTransaccionMetodo + "Hubo un error al  capturamos las proyecciones por periodo " +e);
				response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
				response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
				return response;
			}

			if(resDao.size() > 0){
				VentasPorPeriodoBean ventasPeriodo = new VentasPorPeriodoBean();
				List<AvancePeriodoBean> listaAvancesPorPeriodo = new ArrayList<AvancePeriodoBean>();
				BigDecimal totalProyeccion = BigDecimal.ZERO;
				List<VentasPeriodoEntity> ventaAvance  =null;
				try{
					//2.- Obtenemos el Avance del Total de ventas de todo los  periodos
					ventaAvance =consultaVentasDao.ventasTotalPorPeriodo(0);
				}catch(Exception e){
					System.out.println(mensajeTransaccionMetodo + "Hubo un error al  Obtenemos el Avance del Total de ventas de los periodos " +e);
					response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
					response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
					return response;
				}
				for(ProyeccionPeriodoEntity row : resDao){
					totalProyeccion = totalProyeccion.add(row.getMonto_proyectado());
					AvancePeriodoBean beanPeriodo = new AvancePeriodoBean();
					beanPeriodo.setIdPeriodo(row.getPeriodo_id());
					beanPeriodo.setPeriodo(validaciones.validarCamposString(row.getPeriodo()));
					beanPeriodo.setTotalProyeccion(row.getMonto_proyectado());
					
					BigDecimal totalAvance = BigDecimal.ZERO;
					for(VentasPeriodoEntity venta : ventaAvance){
						if(venta.getPeriodo_id() == row.getPeriodo_id()){
							totalAvance = venta.getTotalventa();
						}
					}
					beanPeriodo.setTotalVentaAvance(totalAvance);
					
					FiltrosSQLBean filtro = new FiltrosSQLBean();
					List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
					FiltrosBean beanFiltro = new FiltrosBean();
					List<String> campo = new ArrayList<String>();
					campo.add("codigo");
					beanFiltro.setCampos(campo);
					beanFiltro.setOperador("=");
					listaFiltros.add(beanFiltro);
					filtro.setListaFiltros(listaFiltros);
					List<Object> valores = new ArrayList<Object>();
					valores.add(validaciones.validarCamposString(row.getCodigo_banda()));
					filtro.setListaValores(valores);
					filtro.setCampoOrden("orden");
					filtro.setTipoOrden("asc");
					
					List<BandaProyeccionEntity> bandaPeriodo =null;
					try{
						//3.- Consultamos las Bandas del periodo
						bandaPeriodo = bandaProyeccionDao.listaBandasProyeccion(filtro);
					}catch(Exception e){
						System.out.println(mensajeTransaccionMetodo + "Hubo un error al  Consultar las Bandas del periodo " +e);
						response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
						response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
						return response;
					}
					
					List<Number> banda = new ArrayList<Number>();
					List<String> colores = new ArrayList<String>();
					BigDecimal montoBanda = BigDecimal.ZERO;
					for(BandaProyeccionEntity bandaList : bandaPeriodo){
						// suma = suma  + porcentaje*totalProyeccionPeriodo
						montoBanda = montoBanda.add(bandaList.getPorcentaje().multiply(row.getMonto_proyectado()));
						//capturamos las bandas de la proyeccion del periodo
						banda.add(montoBanda);
						//capturamos los colores de las bandas
						colores.add(validaciones.validarCamposString(bandaList.getColor()));
					}
					beanPeriodo.setListaBanda(banda);
					beanPeriodo.setColorBanda(colores);
					
					listaAvancesPorPeriodo.add(beanPeriodo);
				}
				ventasPeriodo.setAvancesPorPeriodo(listaAvancesPorPeriodo);
				VentaTotalBean totalAvance = new VentaTotalBean();
				VentaTotalEntity ventaTotal = null;
				try{
					//4.- Consultamos la venta total de todos los periodos
					ventaTotal = consultaVentasDao.ventaTotal();
				}catch(Exception e){
					System.out.println(mensajeTransaccionMetodo + "Hubo un error al Tratar de obtener la venta Total" +e);
					response.setCodigoRespuesta(ConstModAdministracion.MANT_LISTAR_COD_IDT);
					response.setMensajeRespuesta(ConstModAdministracion.MANT_LISTAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
					return response;
				}
				totalAvance.setTotalVentaAnual(totalProyeccion);
				totalAvance.setTotalAvanceAnual(ventaTotal.getTotal_avance_venta());
				
				FiltrosSQLBean filtroBanda = new FiltrosSQLBean();
				List<FiltrosBean> listaFiltrosGeneral = new ArrayList<FiltrosBean>();
				FiltrosBean beanFiltroGeneral = new FiltrosBean();
				List<String> campo = new ArrayList<String>();
				campo.add("codigo");
				beanFiltroGeneral.setCampos(campo);
				beanFiltroGeneral.setOperador("=");
				listaFiltrosGeneral.add(beanFiltroGeneral);
				filtroBanda.setListaFiltros(listaFiltrosGeneral);
				List<Object> valoresBanda = new ArrayList<Object>();
				valoresBanda.add(validaciones.validarCamposString(ConstProyeccion.CODIGO_BANDAS_PROYECCION_GENERAL));
				filtroBanda.setListaValores(valoresBanda);
				filtroBanda.setCampoOrden("orden");
				filtroBanda.setTipoOrden("asc");
				
				List<BandaProyeccionEntity> bandaGeneral =null;
				try{
					//5.- Consultamos las Bandas del la Proyeccion General
					bandaGeneral = bandaProyeccionDao.listaBandasProyeccion(filtroBanda);
				}catch(Exception e){
					System.out.println(mensajeTransaccionMetodo + "Hubo un error al  Consultar las Bandas del periodo " +e);
					response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
					response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
					return response;
				}
				List<String> lsColoresBanda = new ArrayList<String>();
				List<Number> lsBandaGeneral = new ArrayList<Number>();
				BigDecimal montoBandaGeneral = BigDecimal.ZERO;
				for(BandaProyeccionEntity bandaIntervalo :bandaGeneral ){
					montoBandaGeneral = montoBandaGeneral.add(totalProyeccion.multiply(bandaIntervalo.getPorcentaje()));
					lsBandaGeneral.add(montoBandaGeneral);
					lsColoresBanda.add(validaciones.validarCamposString(bandaIntervalo.getColor()));
				}
				totalAvance.setColoresBanda(lsColoresBanda);
				totalAvance.setListaIntervalos(lsBandaGeneral);

				response.setAvancePorPeriodo(ventasPeriodo);
				response.setVentaTotal(totalAvance);
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			}else{
				System.out.println(mensajeTransaccionMetodo+"No se encontraron datos de Proyeccion por periodo");
				response.setCodigoRespuesta(ConstModAdministracion.MANT_LISTAR_COD_IDF);
				response.setMensajeRespuesta(ConstModAdministracion.MANT_LISTAR_MSJ_IDF.replace("msj", mensajeTransaccionMetodo));
			}
			
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error en el proceso" +e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_LISTAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
			return response;
		}
		
		return response;
	}

}
